/*
 * 版权所有 (c) 1996, 2013, Oracle 和/或其关联公司。保留所有权利。
 * ORACLE 专有/机密。使用受许可条款约束。
 */

package jdk.io;

import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectInput;

/**
 * Externalizable 实例类的唯一特性是它们可以写出和恢复其完整状态。
 * 它们通过实现 writeExternal 和 readExternal 方法来负责处理其自身的序列化形式。
 * 这些方法必须明确与超类型协调以保存其状态。
 * 这些对象仅使用 Serializable 接口的标识符，但随后会接管序列化形式的责任。
 *
 * 枚举常量的序列化形式不能自定义。在序列化过程中，枚举常量的 writeObject、
 * readObject、readObjectNoData、writeReplace 和 readResolve 方法都会被忽略。
 * 类似地，任何 Externalizable 类都不能使用 writeReplace 和 readResolve 方法。
 *
 * 当 Externalizable 对象被重建时，会使用 public no-arg 构造函数创建实例，
 * 然后调用 readExternal 方法。可序列化对象从流中恢复时，它们会从流中读取自身。
 *
 * 实现 Externalizable 接口的类必须有一个 public no-arg 构造函数。
 *
 * @author  unascribed
 * @since   JDK1.1
 */
public interface Externalizable extends java.io.Serializable {
    /**
     * 对象实现 writeExternal 方法来保存其内容
     * 通过调用 {@link ObjectOutput} 的方法来写入其字段值。
     *
     * @serialData 超出此处指定的基本数据的可选数据。
     * @param out 用于写入对象的流
     * @exception IOException 包含任何 I/O 异常
     */
    void writeExternal(ObjectOutput out) throws IOException;

    /**
     * 对象实现 readExternal 方法来恢复其内容
     * 通过调用 {@link ObjectInput} 的方法来读取其字段值。
     * readExternal 方法必须读取与 writeExternal 方法写入的相同标签和顺序的值。
     *
     * @param in 用于读取对象的流
     * @exception java.lang.ClassNotFoundException 如果找不到序列化对象的类
     * @exception IOException 如果发生 I/O 错误
     */
    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
